﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.Serialization;

namespace Foundation {
    /// <summary>
    /// Die Klasse für die Speicherung der Daten eines Tracks
    /// </summary>
    [DataContract]
    public class Track : IEquatable<Track> {
        /// <summary>
        /// erstellt aus einer Liste aus Dateipfaden eine Liste mit Tack Objekten
        /// </summary>
        /// <param name="files"></param>
        /// <returns></returns>
        /// <exception cref="FileNameNotValidException"></exception>
        public static List<Track> GetTrackListFromFileList(List<string> files) {
            List<Track> returnList = new List<Track>();

            foreach (string s in files) {
                if (s == null || s.Equals(string.Empty)) {
                    throw new FileNameNotValidException("Es wurde ein ungültiger Dateiname übergeben", null);
                }
                else {
                    string filename = System.IO.Path.GetFileName(s);
                    string path = System.IO.Path.GetDirectoryName(s);
                    returnList.Add(new Track(filename, path));
                }
            }
            return returnList;
        }

        /// <summary>
        /// Konstruktor. Wenn die Id noch nicht vergeben wurde, 
        /// wird eine neue vergeben
        /// </summary>
        /// <param name="name">Name</param>
        /// <param name="path">Pfad</param>
        public Track(string name, string path) :
            this(name, path, Guid.NewGuid().ToString()) { }

        public Track(string name, string path, string id)
            {
            this.Id = Guid.Parse(id);
            this.Name = name;
            this.Path = path;
        }

        /// <summary>
        /// Name des Tracks
        /// </summary>
       [DataMember]
        public string Name { get; set; }

        /// <summary>
        /// Pfad des Tracks
        /// </summary>
        [DataMember]
        public string Path { get; set; }

        /// <summary>
        /// ID des Tracks
        /// </summary>
        [DataMember]
        public Guid Id { get; set; }

        /// <summary>
        /// Gibt den vollen Pfad zurück
        /// </summary>
        /// <exception cref="FileNameNotValidException"></exception>
        public string FullPath {
            get {
                if (string.IsNullOrEmpty(this.Path)) {
                    return this.Name; 
                }
                if (string.IsNullOrEmpty(this.Name)) {
                    throw new FileNameNotValidException("Der Dateiname des Tracks ist nicht gültig", null);
                }
                else {
                    return string.Format("{0}\\{1}", this.Path, this.Name);
                }
            }
        }

        /// <summary>
        /// Gibt die String Representation des Objektes zurück
        /// </summary>
        /// <returns></returns>
        public override string ToString() {
            if (string.IsNullOrEmpty(this.Name)) {
                return string.Format("Track {0}", this.Id);
            }
            else {
                return this.Name;
            }
        }

        /// <summary>
        /// Vergleicht das mitgegebene Objekt mit dem Obkekt, auf welchem die Methode aufgerufen wurde.
        /// </summary>
        /// <param name="other"></param>
        /// <returns></returns>
        public bool Equals(Track other) {
            return this.Id.Equals(other.Id); 
        }
    }
}
